﻿using System;
using System.Collections.Generic;
using WeWork.Entitys.Send;

namespace WeWork.Entitys
{
    /// <summary>
    /// 解密后获取的会话内容
    /// </summary>
    public class ChatMsg
    {
        /// <summary>
        /// 记录的seq值。Uint64类型，范围0-pow(2,64)-1
        /// </summary>
        public long seq { set; get; }
        /// <summary>
        /// 企业微信的企业ID
        /// </summary>
        public string corpid { set; get; } = string.Empty;
        /// <summary>
        /// 消息id，消息的唯一标识，企业可以使用此字段进行消息去重。String类型
        /// </summary>
        public string msgid { set; get; } = string.Empty;
        /// <summary>
        /// 消息动作，目前有send(发送消息)/recall(撤回消息)/switch(切换企业日志)三种类型。String类型
        /// </summary>
        public string action { set; get; } = string.Empty;
        /// <summary>
        /// 群聊消息的群id。如果是单聊则为空。String类型
        /// </summary>
        public string roomid { set; get; } = string.Empty;

        /// <summary>
        /// （切换企业日志）消息发送时间戳，utc时间，ms单位。
        /// (发送消息、撤回消息)消息发送时间戳，utc时间,单位毫秒。
        /// </summary>
        public DateTime msgtime { set; get; }
        /// <summary>
        /// 消息类型
        /// 目前最大长度为20（meeting_notification）
        /// </summary>
        public string msgtype { set; get; } = string.Empty;

        /// <summary>
        /// （小程序消息 title）消息标题。String类型
        /// （位置 title）位置信息的title。String类型
        /// （投票 votetitle）投票主题。String类型
        /// （链接 title）消息标题。String类型
        /// （会话记录消息 title）聊天记录标题。String类型
        /// （待办 title）待办的来源文本。String类型
        /// （填表消息 title）表名。String类型
        /// （会议邀请消息 topic）会议主题。String类型
        /// （在线文档消息 title）在线文档名称
        /// （日程消息 title）日程主题。String类型
        /// </summary>
        public string title { get; set; } = string.Empty;

        /// <summary>
        /// （文本 content）消息内容。String类型
        /// （待办 content）待办的具体内容。String类型
        /// （会话记录消息 item）消息记录内的消息内容，批量数据（json数据）
        /// （填表消息 details）表内容。json数组类型
        /// （会议控制消息 content）会议系统消息内容。String类型
        /// （MarkDown格式消息 content）markdown消息内容，目前为机器人发出的消息
        /// （图文消息 item）图文消息数组，每个item结构包含title、description、url、picurl等结构
        /// （投票 voteitem）投票选项，可能多个内容。String数组
        /// （混合消息 item）消息标题。String类型
        /// </summary>
        public string content { set; get; } = string.Empty;
        
        /// <summary>
        /// （撤回消息 pre_msgid）标识撤回的原消息的msgid。String类型
        /// （投票 voteid）投票id，方便将参与投票消息与发起投票消息进行前后对照。String类型
        /// （音频存档消息 voiceid）音频id
        /// （音频共享文档消息 voipid）音频id
        /// </summary>
        public string keyid { set; get; } = string.Empty;

        /// <summary>
        /// （表情 type）表情类型，png或者gif.1表示gif 2表示png。Uint32类型
        /// （红包消息 type）红包消息类型。1 普通红包、2 拼手气群红包、3 激励群红包。Uint32类型
        /// （互通红包消息 type）红包消息类型。1 普通红包、2 拼手气群红包。Uint32类型
        /// （投票 votetype）投票类型.101发起投票、102参与投票。Uint32类型
        /// （会议邀请消息 meetingtype）会议消息类型。101发起会议邀请消息、102处理会议邀请消息。Uint32类型
        /// （会议控制消息 notification_type）1表示有人加入了会议，2表示会议已经结束。Uint32类型
        /// （视频号消息 feed_type）视频号消息类型。2 图片、4 视频、9 直播。Uint32类型
        /// （音视频通话 invitetype）通话类型，uint32类型 1; 单人视频通话 2; 单人语音通话 3; 多人视频通话 4; 多人语音通话
        /// </summary>
        public int type { get; set; } = 0;

        #region 图片、文件、语音、视频、表情
        /// <summary>
        /// （图片、语音、视频、表情、文件）资源的md5值，供进行校验。String类型
        /// （音频共享文档消息 md5sum）共享文件的md5值。String类型
        /// </summary>
        public string md5sum { set; get; } = string.Empty;
        /// <summary>
        /// （图片、语音、视频、表情、文件）媒体资源的id信息。String类型
        /// （音频存档消息）音频媒体下载的id。String类型
        /// （音频共享文档消息）共享文件的sdkfile，通过此字段进行媒体数据下载。String类型
        /// </summary>
        public string sdkfileid { set; get; } = string.Empty;
        /// <summary>
        /// （图片 filesize）图片资源的文件大小
        /// （文件 filesize）文件大小
        /// （语音 voice_size）语音消息大小
        /// （视频 file_size）资源的文件大小
        /// （表情 imagesize）资源的文件大小
        /// （音频共享文档消息 filesize）共享文件的大小。Uint64类型
        /// </summary>
        public int filesize { set; get; } = 0;
        /// <summary>
        /// （文件）文件名称。String类型
        /// （音频共享文档消息 filename）文档共享文件名称。String类型
        /// （微盘文件）文件名称，String类型
        /// </summary>
        public string filename { get; set; } = string.Empty;

        #region 文件
        /// <summary>
        /// （文件）文件类型后缀。String类型
        /// </summary>
        public string fileext { get; set; } = string.Empty;
        #endregion 文件

        /// <summary>
        /// （语音 play_length）播放长度。Uint32类型
        /// （视频 play_length）视频播放长度。Uint32类型
        /// （音视频通话 callduration）通话时长，单位秒，uint32类型
        /// </summary>
        public int playlength { get; set; } = 0;

        #region 表情
        /// <summary>
        /// （表情）表情图片宽度。Uint32类型
        /// </summary>
        public int width { get; set; } = 0;
        /// <summary>
        /// （表情）表情图片高度。Uint32类型
        /// </summary>
        public int height { get; set; } = 0;
        #endregion 表情

        #endregion 图片、文件、语音、视频、表情

        /// <summary>
        /// （切换企业日志 user）具体为切换企业的成员的userid。String类型
        /// （同意会话聊天内容 userid）同意/不同意协议者的userid，外部企业默认为external_userid。String类型
        /// （名片 userid）名片所有者的id，同一公司是userid，不同公司是external_userid。String类型
        /// （在线文档消息 doc_creator）在线文档创建者。本企业成员创建为userid；外部企业成员创建为external_userid
        /// </summary>
        public string userid { get; set; } = string.Empty;

        #region 同意/不同意会话聊天内容
        /// <summary>
        /// UTC时间的字符串 yyyy-MM-dd HH:mm:ss:fff
        /// （同意会话聊天内容 agree_time）同意协议的时间，utc时间，ms单位（同意会话聊天内容）
        /// （不同意会话聊天内容 disagree_time）同意/不同意协议的时间，utc时间，ms单位
        /// </summary>
        public string agree_time { get; set; }
        #endregion 同意/不同意会话聊天内容

        /// <summary>
        /// （名片 corpname）名片所有者所在的公司名称。String类型
        /// （小程序消息 displayname）小程序名称。String类型
        /// （填表消息 room_name）填表消息所在的群名称。String类型
        /// （视频号消息 sph_name）视频号账号名称。String类型
        /// </summary>
        public string keyname { get; set; } = string.Empty;

        /// <summary>
        /// （小程序消息 description）消息描述。String类型
        /// （链接 description）消息描述。String类型
        /// （视频号消息 feed_desc）视频号消息描述。String类型
        /// </summary>
        public string description { get; set; } = string.Empty;

        /// <summary>
        /// （小程序消息 username）用户名称。String类型
        /// （填表消息 creator）创建者在群中的名字。String类型
        /// （日程消息 creatorname）日程组织者。String类型
        /// </summary>
        public string username { get; set; } = string.Empty;

        #region 位置
        /// <summary>
        /// （位置）经度，单位double
        /// </summary>
        public double longitude { get; set; } = 0;
        /// <summary>
        /// （位置）纬度，单位double
        /// </summary>
        public double latitude { get; set; } = 0;
        /// <summary>
        /// （位置）缩放比例。Uint32类型
        /// </summary>
        public int zoom { get; set; } = 0;
        #endregion 位置

        #region 链接
        /// <summary>
        /// （链接）链接图片url。String类型
        /// </summary>
        public string image_url { get; set; } = string.Empty;
        #endregion 链接

        /// <summary>
        /// （链接）链接url地址。String类型
        /// （在线文档消息）在线文档链接
        /// </summary>
        public string link_url { get; set; } = string.Empty;

        /// <summary>
        /// （填表消息 create_time）创建的时间。String类型 "create_time":"2019-12-11 11:21:22"
        /// （会议控制消息）"time": "2023-11-24 16:52:38:880"
        /// </summary>
        public string time { get; set; } = string.Empty;

        #region 红包消息 、 互通红包消息
        /// <summary>
        /// （红包消息）红包祝福语。String类型
        /// （互通红包消息）红包祝福语。String类型
        /// </summary>
        public string wish { get; set; } = string.Empty;
        /// <summary>
        /// （红包消息）红包总个数。Uint32类型
        /// （互通红包消息）红包总个数。Uint32类型
        /// </summary>
        public int totalcnt { get; set; } = 0;
        /// <summary>
        /// （红包消息）红包总金额。Uint32类型，单位为分。
        /// （互通红包消息）红包总金额。Uint32类型，单位为分。
        /// </summary>
        public int totalamount { get; set; } = 0;
        #endregion  红包消息 、 互通红包消息

        /// <summary>
        /// （位置）地址信息。String类型
        /// （会议邀请消息）会议地址。String类型
        /// （日程消息 place）日程地点。String类型
        /// </summary>
        public string address { get; set; } = string.Empty;
        /// <summary>
        /// UTC时间的字符串 yyyy-MM-dd HH:mm:ss:fff
        /// （会议邀请消息）会议开始时间。Utc时间
        /// （日程消息）日程开始时间。Utc时间，单位秒
        /// </summary>
        public string starttime { get; set; } = string.Empty;
        /// <summary>
        /// UTC时间的字符串 yyyy-MM-dd HH:mm:ss:fff
        /// （会议邀请消息）会议结束时间。Utc时间
        /// （日程消息）日程结束时间。Utc时间，单位秒
        /// （音频存档消息）音频结束时间。uint32类型
        /// </summary>
        public string endtime { get; set; } = string.Empty;
        /// <summary>
        /// （会议邀请消息）会议备注。String类型。
        /// （日程消息）日程备注。String类型
        /// </summary>
        public string remarks { get; set; } = string.Empty;

        /// <summary>
        /// （会议邀请消息 meetingid）会议id。方便将发起、处理消息进行对照。uint64类型
        /// （会议控制消息 meeting_id）会议id。Uint64类型
        /// </summary>
        public long meetingid { get; set; } = 0;

        /// <summary>
        /// （会议邀请消息）会议邀请处理状态。1 参加会议、2 拒绝会议、3 待定、4 未被邀请、5 会议已取消、6 会议已过期、7 不在房间内。Uint32类型。只有meetingtype为102的时候此字段才有内容。
        /// </summary>
        public int status { get; set; } = 0;

        #region 日程消息
        /// <summary>
        /// （日程消息）日程参与人。数组，内容为String类型
        /// </summary>
        public string attendeename { get; set; } = string.Empty;
        #endregion 日程消息

        #region 音频存档消息
        /// <summary>
        /// （音频存档消息）文档分享对象，Object类型（json字符串）
        /// </summary>
        public string demofiledata { get; set; } = string.Empty;
        /// <summary>
        /// （音频存档消息）文档分享对象，Object类型（json字符串）
        /// </summary>
        public string sharescreendata { get; set; } = string.Empty;
        #endregion 音频存档消息
        
        /// <summary>
        /// 发送人/接收人列表
        /// </summary>
        public List<ChatUser> users { set; get; } = new List<ChatUser>();

        /// <summary>
        /// 混合消息内容
        /// </summary>
        public List<IChatMixedBase> chatMixedItems;

        /// <summary>
        /// 创建时间，建议使用utc时间（避免不同时区的时间）
        /// </summary>
        public DateTime createdate { set; get; }
    }

    public class ChatUser
    {
        /// <summary>
        /// 消息发送方id。同一企业内容为userid，非相同企业为external_userid。消息如果是机器人发出，也为external_userid。String类型
        /// 消息接收方列表，可能是多个，同一个企业内容为userid，非相同企业为external_userid。数组，内容为string类型
        /// </summary>
        public string userid { set; get; } = string.Empty;
        /// <summary>
        /// 1：员工；2：外部联系人; 3：机器人
        /// </summary>
        public int usertype { set; get; }
        /// <summary>
        /// 是否发送人 否则接收人
        /// </summary>
        public bool isfrom { set; get; }
    }
}
